home *** CD-ROM | disk | FTP | other *** search
- DEFINT A-Z
- TYPE RegType
- AX AS INTEGER
- BX AS INTEGER
- CX AS INTEGER
- DX AS INTEGER
- BP AS INTEGER
- SI AS INTEGER
- DI AS INTEGER
- Flags AS INTEGER
- DS AS INTEGER
- ES AS INTEGER
- END TYPE
-
- DIM SHARED Regs AS RegType
- DECLARE SUB FGetArray (Handle, Buffer$, Bytes&)
- DECLARE SUB FPutArray (Handle, Buffer$, Bytes&)
- DECLARE SUB InstallCEH ()
- DECLARE SUB RemoveCEH ()
- DECLARE FUNCTION CEHError ()
- DECLARE FUNCTION Exist (FileName$)
- DECLARE FUNCTION FileCopy (Src$, Dest$, Buffer$)
-
- Buffer$ = STRING$(4096, 0)
- Result = FileCopy("A:TEST.IN", "A:TEST.OUT", Buffer$)
- SELECT CASE Result
- CASE -1
- PRINT "File(s) copied OK."
- CASE 0
- PRINT "Disk is write-protected."
- CASE 1
- PRINT "Invalid drive letter."
- CASE 2
- PRINT "Drive not ready."
- CASE 7
- PRINT "Disk not formatted."
- CASE 10
- PRINT "Write error."
- CASE 11
- PRINT "Read error."
- CASE 53
- PRINT "File not found."
- CASE 61
- PRINT "Disk is full."
- CASE ELSE
- PRINT "Critical error."
- END SELECT
- END
-
- FUNCTION Exist (FileSpec$)
-
- CALL InstallCEH
- Temp$ = FileSpec$ + CHR$(0)
- Regs.AX = &H4E00 'Find first matching file
- Regs.CX = 0
- Regs.DS = VARSEG(Temp$)
- Regs.DX = SADD(Temp$)
- CALL InterruptX(&H21, Regs, Regs)
- CALL RemoveCEH
- IF (CEHError > -1) OR (Regs.AX AND 255) THEN
- Exist = 0
- ELSE
- Exist = -1
- END IF
-
- END FUNCTION
-
- SUB FGetArray (Handle, Buffer$, Bytes&)
-
- CALL InstallCEH
- Regs.AX = &H3F00 'Read file service.
- Regs.BX = FILEATTR(Handle, 2) 'DOS file handle.
- Regs.CX = Bytes& OR -(Bytes& AND &H8000) 'Convert to unsigned int.
- Regs.DS = VARSEG(Buffer$)
- Regs.DX = SADD(Buffer$)
- Regs.ES = -1: Regs.BP = -1
- CALL InterruptX(&H21, Regs, Regs)
- CALL RemoveCEH
- Bytes& = Regs.AX AND &HFFFF& 'Convert to signed int.
- IF (Regs.Flags AND 1) THEN
- Bytes& = -1 'Error!
- END IF
-
- END SUB
-
- FUNCTION FileCopy (Src$, Dest$, Buffer$)
-
- IF NOT Exist(Src$) THEN
- ErrCode = CEHError 'Get critical error code.
- IF ErrCode = -1 THEN 'If code is -1, then return
- ErrCode = 53 'code for 'file not found'.
- END IF
- FileCopy = ErrCode
- EXIT FUNCTION
- END IF
-
- Src = FREEFILE
- OPEN Src$ FOR BINARY AS Src 'Open source file.
- Dest = FREEFILE 'Open dest file for output,
- OPEN Dest$ FOR OUTPUT AS Dest 'to truncate it if it exists.
-
- Remaining& = LOF(Src) 'Keep track of bytes
- DO WHILE Remaining& > 0 'to be copied.
- Bytes& = LEN(Buffer$)
- CALL FGetArray(Src, Buffer$, Bytes&) 'Get a chunk from Src.
- IF Bytes& = -1 THEN EXIT DO 'Exit if error.
- CALL FPutArray(Dest, Buffer$, Bytes&) 'Write array to Dest.
- IF Bytes& <= 0 THEN EXIT DO
- Remaining& = Remaining& - Bytes& 'Adjust Remaining& and
- LOOP ' do it again.
- IF Bytes& = 0 THEN
- ErrCode = 61 'Disk full.
- ELSE
- ErrCode = CEHError 'Return error code.
- END IF
- CLOSE Src, Dest 'Close 'em.
- FileCopy = ErrCode
-
- END FUNCTION
-
- SUB FPutArray (Handle, Buffer$, Bytes&)
-
- CALL InstallCEH
- Regs.AX = &H4000 'Read file service.
- Regs.BX = FILEATTR(Handle, 2) 'DOS file handle.
- Regs.CX = Bytes& OR -(Bytes& AND &H8000) 'Convert to unsigned int.
- Regs.DS = VARSEG(Buffer$)
- Regs.DX = SADD(Buffer$)
- Regs.ES = -1: Regs.BP = -1
- CALL InterruptX(&H21, Regs, Regs)
- CALL RemoveCEH
- Bytes& = Regs.AX AND &HFFFF& 'Convert to signed int.
- IF (Regs.Flags AND 1) THEN
- Bytes& = -1 'Error!
- END IF
-
- END SUB
-
-